/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import Enum.LoaiNguoiDungEnum;
import java.util.Date;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pojo.ChiTietPhieuNhapHang;
import pojo.NguoiDung;
import pojo.PhieuNhapHang;
import pojo.QuyDinh;
import pojo.SanPhamCuaHang;
import util.NewHibernateUtil;

/**
 *
 * @author 0
 */
public class PhieuNhapHangDAO extends BaseDAO{
    public static List<PhieuNhapHang> TimKiem(Integer maPhieuNhapHang,Date ngayLapPhieuFrom,Date ngayLapPhieuTo,Integer idCuaHang,NguoiDung nguoiDung) throws Exception{
        Session session=NewHibernateUtil.getSessionFactory().openSession();
        String string="from PhieuNhapHang pnh where (pnh.isDelete=false or pnh.isDelete=null)";
        if(nguoiDung.getLoaiNguoiDung().getId()!=LoaiNguoiDungEnum.Admin.getCode()){
            string+=String.format(" and pnh.cuaHang.id=%d",nguoiDung.getCuaHang().getId());
        }
        if(maPhieuNhapHang!=null){
            string+=String.format(" and pnh.id=%d",maPhieuNhapHang);
        }
        if(ngayLapPhieuFrom!=null){
            string+=" and pnh.ngayLapPhieu>=:ngayLapPhieuFrom";
        }
        if(ngayLapPhieuTo!=null){
            string+=" and pnh.ngayLapPhieu<=:ngayLapPhieuTo";
        }
        if(idCuaHang!=null){
            string+=String.format(" and pnh.cuaHang.id=%d",idCuaHang);
        }
        Query query=session.createQuery(string);
        if(ngayLapPhieuFrom!=null){
            query.setDate("ngayLapPhieuFrom", ngayLapPhieuFrom);
        }
        if(ngayLapPhieuTo!=null){
            query.setDate("ngayLapPhieuTo", ngayLapPhieuTo);
        }
        List<PhieuNhapHang> phieuNhapHangs=query.list();
        session.close();
        return phieuNhapHangs;
    }
    
    public static int Them(PhieuNhapHang phieuNhapHang,List<ChiTietPhieuNhapHang> chiTietPhieuNhapHangs) throws Exception{
        int id=0;
        Session session=NewHibernateUtil.getSessionFactory().openSession();
        Transaction transaction=session.beginTransaction();
        try{
            QuyDinh quyDinh=(QuyDinh) session.createQuery("from QuyDinh").uniqueResult();
            for(ChiTietPhieuNhapHang chiTietPhieuNhapHang:chiTietPhieuNhapHangs){
                if(chiTietPhieuNhapHang.getSoLuong()<quyDinh.getSoLuongHangNhapToiThieu()){
                    session.close();
                    throw new Exception(String.format("Không được nhập sản phẩm nào có số lượng nhỏ hơn %d",quyDinh.getSoLuongHangNhapToiThieu()));
                }
                if(chiTietPhieuNhapHang.getSoLuong()>quyDinh.getSoLuongHangNhapToiDa()){
                    session.close();
                    throw new Exception(String.format("Không được nhập sản phẩm nào có số lượng lớn hơn %d",quyDinh.getSoLuongHangNhapToiDa()));
                }
                SanPhamCuaHang sanPhamCuaHang=(SanPhamCuaHang) session.get(SanPhamCuaHang.class, chiTietPhieuNhapHang.getSanPhamCuaHang().getId());
                sanPhamCuaHang.setSoLuong(sanPhamCuaHang.getSoLuong()+chiTietPhieuNhapHang.getSoLuong());
                chiTietPhieuNhapHang.setPhieuNhapHang(phieuNhapHang);
                session.update(sanPhamCuaHang);
                session.save(chiTietPhieuNhapHang);
            }
            id = (int) session.save(phieuNhapHang);
            transaction.commit();
            session.close();
        }
        catch(HibernateException exception){
            transaction.rollback();
            session.close();
            throw new Exception(exception.getMessage());
        }
        return id;
    }
}
